/***********************************************************************************
 * 文件名： page_num_charge.c
 * 版本： 1
 * 说明：
 * 		数字主题充电待机页面。
 * 修改记录：
 * 	2024/03/05: 初版。 刘言。
***********************************************************************************/
#include "page_num_charge.h"
#include "seg_num_stbar.h"
#include "resource.h"
#include "ui_ctrl.h"
#include "../dmu.h"
#include "../app.h"
#include "components/lcd_drivers/lcd.h"
#include "components/lcd_drivers/simple_gui/sgui.h"
#include "components/umi/umi_static.h"
#include "components/battery_manager/battery_manager.h"


/////////////////////// 自定义类型

// 页面类
typedef struct _page
{
    // 继承页面基类
    ui_page_base_t Base;    // 必须放在最开始表示继承(实例地址=本结构体实例地址)

    sg_pic_t PicOutput[2];
    sg_pic_t PicWatt;

    seg_num_stbar_t *StBar;

    u16 Power;          // 输出功率值,单位mW
    u8 Timeout;
    u8 IsOff;           // 1：关机充电
}page_t;


/////////////////////// 内部函数申明

static void TimerIsr(void *user_data);
static void RhcEvent(rhc_ev_t e);
static void BtnEvent(btn_ev_t e, void *user_data);
static void SwsdEvent(swsd_ev_t e);
static void UpdatePowerDis(page_t *this);

/////////////////////// 事件

// 页面事件
static void PageEvent(ui_ev_t *e)
{
    page_t *this = (page_t *)e->Target;

    switch (e->Code)
    {
    case UI_EV_PAGE_LOADED:
        this->StBar = Seg_CreatNumStBar(1);
        if(this->IsOff == 0) // 开机状态，需要接管按钮和咪头事件，触发后切换到主页面
        {
            Btn_SetCb(BtnEvent, this);
            SWSD_SetCb(SwsdEvent);
            RHC_SetCallBack(RhcEvent);
            Polsys_SetEntry(&PublicTimer, TimerIsr, this);
            Polsys_SetInterval(&PublicTimer, 100);
        }
        break;
    case UI_EV_PAGE_UNLOADED:
        if(this->IsOff == 0)
        {
            Polsys_SetEntry(&PublicTimer, NULL, NULL);
            Btn_SetCb(NULL, NULL);
            SWSD_SetCb(NULL);
            RHC_SetCallBack(NULL);
        }
        break;
    default:
        break;
    }
}

/**
 * 软定时器 100ms
*/
static void TimerIsr(void *user_data)
{
    page_t *this = user_data;
    if(BM_GetDCConnectStatus() == false)
    {
        this->Timeout++;
        if(this->Timeout >= 30)
        {
            Ui_SwitchToPage(Page_CreatNumMain, (void *)0);
        }
    }
}

/**
 * RHC事件
*/
static void RhcEvent(rhc_ev_t e)
{
    page_t *this = (page_t *)Ui_GetNowPage();
    App_ClrIdleTime();
    switch(e)
    {
    case RHC_EV_LOADED:
    case RHC_EV_UNLOADED:
        RHC_UpdateRes();
        Ui_SwitchToPage(Page_CreatNumMain, (void *)2);
        break;
    default: break;
    }
}

static void BtnEvent(btn_ev_t e, void *user_data)
{
    App_ClrIdleTime();
    switch(e)
    {
    case BTN_EV_DOWN:
        Ui_SwitchToPage(Page_CreatNumMain, (void *)1);
        break;
    default: break;
    }
}

static void SwsdEvent(swsd_ev_t e)
{
    page_t *this = (page_t *)Ui_GetNowPage();
    App_ClrIdleTime();
    switch(e)
    {
    case SWSD_EV_TRIG:
        Ui_SwitchToPage(Page_CreatNumMain, (void *)1);
        break;
    default: break;
    }
}

///////////////////////////////////// 内部其他函数

static void UpdatePowerDis(page_t *this)
{
    u16 temp;

    SgPic_setSource(&this->PicOutput[0], Pic_T0BigNum[this->Power / 10000]);
    temp = this->Power % 10000;
    SgPic_setSource(&this->PicOutput[1], Pic_T0BigNum[temp / 1000]);
}

/////////////////////// 删除

/**
 * 删除页面。
 * 在这里释放页面占用的所有内存，如果有必要可以清除显示。
*/
static void DeletePage(ui_page_base_t *page)
{
    page_t *this = (page_t *)page;

    Seg_DeleteNumStBar(this->StBar);
    free(this);
    // Lcd_Clear(0, 0, LCD_SIZE_X - 1, LCD_SIZE_Y - 1);
}

/////////////////////// 创建


ui_page_base_t * Page_CreatNumCharge(void *param)
{
    int i;

    page_t *page = malloc(sizeof(page_t));
    memset(page, 0, sizeof(page_t));
    Ui_PageBaseInit((ui_page_base_t *)page);
    Ui_PageSetDeleteFun((ui_page_base_t *)page, DeletePage);
    Ui_PageSetCb((ui_page_base_t *)page, PageEvent);

    page->IsOff = (int)param;

    // 加载保存的参数
    Umi_Read(0x0208, (u8 *)&page->Power, 2);

    // 加载背景
    Lcd_Clear(0, 0, LCD_SIZE_X - 1, LCD_SIZE_Y - 1);

    // 输出值数字
    for(i = 0; i < 2; i++)
    {
        SgPic_init(&page->PicOutput[i]);
        SgObj_setPosition(&page->PicOutput[i], 15 + 19 * i, 26);
        SgObj_setSize(&page->PicOutput[i], PIC_T0_BIG_NUM_0_SIZE_X, PIC_T0_BIG_NUM_0_SIZE_Y);
    }
    UpdatePowerDis(page);

    // Watt图标
    SgPic_init(&page->PicWatt);
    SgObj_setPosition(&page->PicWatt, 56, 30);
    SgObj_setSize(&page->PicWatt, PIC_T0_WATT_SIZE_X, PIC_T0_WATT_SIZE_Y);
    SgPic_setSource(&page->PicWatt, PIC_T0_WATT_ADDR);

    return (ui_page_base_t *)page;
}




